#include "../games/globale.h" // Fonction et Headers globaux
#include "../games/cls_configuration.h" // Classe de gestion du fichier de configuration
#include "../objects/cls_map.h" // objet du monde

/* ----------------------------------------------------
			Constructeur
  ----------------------------------------------------- */
cls_Map::cls_Map()
{
    debugTrace("Constructeur cls_Map");

    // Initialisation des surfaces
    this->p_sdlS_Imagefond = NULL;

    // Initialisation des variables pour tous les maps
    this->n_xVelocity = 0;
    this->n_yVelocity = 0;

    // Initialisation de nextUpdateTime
    this->n_NextUpdateTime = 0;

}

/* ----------------------------------------------------
			Destructeur
  ----------------------------------------------------- */
cls_Map::~cls_Map()
{
    debugTrace("Destructeur cls_Map");
}


/* ----------------------------------------------------
			Retourne la valeur temps du prochain
			Affichage de la map
  ----------------------------------------------------- */
int cls_Map::getMapDelai() const
{
    return this->n_CST_MapDelay;
}


/* ----------------------------------------------------
			Deplace le décors vers la gauche
  ----------------------------------------------------- */
bool cls_Map::fct_MoveLeftStart()
{
    bool wasMoving=false; // Permet de savoir si le monde était en mouvement

    if (this->n_xVelocity != 0)
        wasMoving=true;

    this->n_xVelocity = -this->n_CST_MapVelocity;

    return wasMoving;
}


/* ----------------------------------------------------
			Deplace le décors vers la droite
  ----------------------------------------------------- */
bool cls_Map::fct_MoveRightStart()
{
    bool wasMoving=false; // Permet de savoir si le monde était en mouvement

    if (this->n_xVelocity != 0)
        wasMoving=true;

    this->n_xVelocity = this->n_CST_MapVelocity;

    return wasMoving;
}


/* ----------------------------------------------------
			Arrete le déplacement du décors
  ----------------------------------------------------- */
bool cls_Map::fct_MoveStop()
{
    bool wasMoving=false; // Permet de savoir si le monde était en mouvement

    if (this->n_xVelocity != 0)
        wasMoving=true;

    this->n_xVelocity = 0;

    return wasMoving;
}


/* ----------------------------------------------------
			Détermine si c'est possible ou non
			de continuer le déplacement de la fenêtre
  ----------------------------------------------------- */
bool cls_Map::fct_IsMovePossible(int n_DirectionMovement)
{

    bool flgResult=false;

    switch (n_DirectionMovement)
    {
        case CST_PERSO_MOVE_RIGHT:
            if (this->sdlR_PositionMap_Decalage.x < this->n_CST_MapWidth - cls_Configuration::getWindowWidth())
                {flgResult = true;}
            else
                {flgResult = false;}
            break;

        case CST_PERSO_MOVE_LEFT:
            if (this->sdlR_PositionMap_Decalage.x > 0)
                {flgResult = true;}
            else
                {flgResult = false;}
            break;
    }

    return flgResult;

}

/* ----------------------------------------------------
			On charge l'image de fond
  ----------------------------------------------------- */
void cls_Map::fct_InitMap(cls_Mouse* clsMouse_Encours, cls_Scenario* clsScenario)
{
    StrucMap* valParamMap;

    // Récupératiuon des paramètres de la map
    valParamMap = clsScenario->getParaMap();

    this->clsMouse_Encours = clsMouse_Encours;

    // Initialisation selon les maps
    this->n_CST_MapWidth = valParamMap->n_MapWidth;
    this->n_CST_MapHeight = valParamMap->n_MapHeight;
    this->n_CST_MapVelocity = valParamMap->n_MapVelocity;
    this->n_CST_MapDelay = valParamMap->n_MapDelay;
    /*
    this->n_CST_MapWidth = n_CST_MapWidth;
    this->n_CST_MapHeight = n_CST_MapHeight;
    this->n_CST_MapVelocity = n_CST_MapVelocity;
    this->n_CST_MapDelay = n_CST_MapDelay;
    */

    this->p_sdlS_Imagefond = load_image(join_pathFile(PATH_DATA_IMG_MAPS, valParamMap->st_FileName));
    //this->p_sdlS_Imagefond = load_image(join_pathFile(PATH_DATA_IMG_MAPS, "niveau_01_1024.png"));
    //this->p_sdlS_Imagefond = load_image("fond1024.png");

    this->sdlR_PositionMap_XY.x = 0;
    this->sdlR_PositionMap_XY.y = 0;
    this->sdlR_PositionMap_XY.w = cls_Configuration::getWindowWidth();
    this->sdlR_PositionMap_XY.h = cls_Configuration::getWindowHeight();

    this->sdlR_PositionMap_Decalage.x = valParamMap->n_DefaultX;
    this->sdlR_PositionMap_Decalage.y = valParamMap->n_DefaultY;
    this->sdlR_PositionMap_Decalage.w = cls_Configuration::getWindowWidth();
    this->sdlR_PositionMap_Decalage.h = cls_Configuration::getWindowHeight();
}


/* ----------------------------------------------------
    Gestion des évènements
    On passe dans la fonction [fct_HandleInput] dans chaque classes : cls_map, cls_personnage, cls_object
  ----------------------------------------------------- */
void cls_Map::fct_HandleInput(SDL_Event event)
{
    switch (event.type)
    {
        // Lors du Mouse_MOVE
        case SDL_MOUSEMOTION:
            // On vient dessiner le curseur de déplacement
            this->clsMouse_Encours->fct_SetMouseCursor(MOUSE_CURSOR_MOVE);
            break;

        default: break;
    }
}


/* ----------------------------------------------------
			On Dessine l'image de fond au bon endroit
  ----------------------------------------------------- */
void cls_Map::fct_DrawMap(SDL_Surface *p_sdlS_Ecran, int n_CurrentTime)
{


    // Si on a dépassé la "date" de mise à jour du sprite, on passe à l'étape suivante de l'animation
    if(n_CurrentTime > this->n_NextUpdateTime)
    {
        // Décalage de la fenêtre
        this->sdlR_PositionMap_Decalage.x += this->n_xVelocity;


        // Il faut géré les bords de la fenêtre
        if (this->sdlR_PositionMap_Decalage.x < 0)
        {
            this->sdlR_PositionMap_Decalage.x = 0;
            this->fct_MoveStop();
        }


        if(this->sdlR_PositionMap_Decalage.x > this->n_CST_MapWidth - cls_Configuration::getWindowWidth())
        {
            this->sdlR_PositionMap_Decalage.x = this->n_CST_MapWidth - cls_Configuration::getWindowWidth();
            this->fct_MoveStop();
        }

        // On fixe la date du prochain changement : une demi seconde après
        this->n_NextUpdateTime = n_CurrentTime + this->n_CST_MapDelay;

    }

    SDL_BlitSurface(this->p_sdlS_Imagefond, &this->sdlR_PositionMap_Decalage, p_sdlS_Ecran, &this->sdlR_PositionMap_XY);

}



/* ----------------------------------------------------
			On libere l'image de fond
  ----------------------------------------------------- */
void cls_Map::fct_FreeSurface()
{
    SDL_FreeSurface(this->p_sdlS_Imagefond);

/*
    // Joda du 15/01/2008
    free(this->clsMouse_Encours);
*/
}
